---
description: Reuse tests across contexts with `this`
title: Shared Behaviours
---

Mocha currently has no concept of a "shared behaviour" however the "contexts" facilitate this feature. For example suppose you have an `Admin` which inherits from `User`, you most likely will not want to duplicate the `User` tests for `Admin`. The "context" (`this`) is the same object within the "before each", "after each" hooks, and the test-case itself, allowing you to utilize this instead of closures to store data. The following is an example of how you can achieve this sort of functionality:

shared.js:

```js
exports.shouldBehaveLikeAUser = function () {
  it("should have .name.first", function () {
    this.user.name.first.should.equal("tobi");
  });

  it("should have .name.last", function () {
    this.user.name.last.should.equal("holowaychuk");
  });

  describe(".fullname()", function () {
    it("should return the full name", function () {
      this.user.fullname().should.equal("tobi holowaychuk");
    });
  });
};
```

test.js:

```js
var User = require("./user").User,
  Admin = require("./user").Admin,
  shared = require("./shared");

describe("User", function () {
  beforeEach(function () {
    this.user = new User("tobi", "holowaychuk");
  });

  shared.shouldBehaveLikeAUser();
});

describe("Admin", function () {
  beforeEach(function () {
    this.user = new Admin("tobi", "holowaychuk");
  });

  shared.shouldBehaveLikeAUser();

  it("should be an .admin", function () {
    this.user.admin.should.be.true;
  });
});
```

user.js:

```js
exports.User = User;
exports.Admin = Admin;

function User(first, last) {
  this.name = {
    first: first,
    last: last,
  };
}

User.prototype.fullname = function () {
  return this.name.first + " " + this.name.last;
};

function Admin(first, last) {
  User.call(this, first, last);
  this.admin = true;
}

Admin.prototype.__proto__ = User.prototype;
```
